@main[]
$string[^main_content[]]
$string

@main_content[]

$ver[v.0.9.7]

<html>
<head>
  <title>Одминко</title>

	<style type='text/css'>
	  /* стили индикатора загрузки страницы */
    #loading-mask
    {
      width:100%;
      height:100%;
      background:#eee;
      position:absolute;
      z-index:20000;
      left:0px;
      top:0px;
    }

    #loading
    {
      position:absolute;
      left:42%;
      top:42%;
      border:1px solid #666;
      padding:2px;
      background:#aaa;
      width:200px;
      text-align:center;
      z-index:20001;
    }

    #loading .loading-indicator {
			background-image: url('/admin/_img/extanim32.gif') no-repeat;

      border:1px solid #666;
      background: white;
      background-position: 15px center;
      color:#444;
      font:bold 13px tahoma,arial,helvetica;
      padding:10px;
      margin:0;
    }
	</style>

</head>
<body style='overflow: hidden'>

	<div id="loading-mask">&nbsp^;</div>
	<div id="loading">
		<div class="loading-indicator">
			<img src="/admin/_img/extanim32.gif" style="width:32px; height:32px; vertical-align: middle" alt="" />&nbsp^;<nobr>Одминко $ver</nobr>
		</div>
	</div>

	<!-- ########################################################################################## -->


	<link rel="stylesheet" type="text/css" href="/admin/_js/ext-2.0/resources/css/ext-all.css" />
  <link rel="stylesheet" type="text/css" href="/admin/_js/ext-2.0/resources/css/xtheme-slate-cor.css" />
  <link rel="stylesheet" type="text/css" href="/admin/css/admin.css" />

  <script type="text/javascript" src="/admin/_js/ext-2.0/adapter/ext/ext-base.js"></script>
  <script type="text/javascript" src="/admin/_js/ext-2.0/ext-all.js"></script>

  ^rem{
  <script type="text/javascript" src="/admin/_js/ext-2.0/plugins/upload/upload_form_2.js.gz"></script>
  <link rel="stylesheet" type="text/css" href="/admin/_js/ext-2.0/plugins/upload/uploadform.css">
  }

	^rem{ FCKEDITOR }
  <script type="text/javascript" src="/admin/_js/fckeditor/fckeditor.js"></script>
  <script type="text/javascript" src="/admin/_js/ext-2.0/plugins/Ext.FCKeditor.js"></script>


	^rem{ Модифицированный htmleditor }
	<script type="text/javascript" src="/admin/_js/ext-2.0/plugins/htmleditor/htmleditor.js"></script>
	<script type="text/javascript" src="/admin/_js/ext-2.0/plugins/htmleditor/htmleditorstyles.js"></script>
	<link rel="stylesheet" type="text/css" href="/admin/_js/ext-2.0/plugins/htmleditor/htmleditor.css" />


	^rem{ плагин к текстовому редактору (вставить изображение) }
	<script type="text/javascript" src="/admin/_js/ext-2.0/plugins/Ext.ux.plugins.HTMLEditorEditImage.js"></script>
	<style type="text/css">
		.x-html-editor-tb .x-edit-insertimage .x-btn-text {
			background:transparent url(/admin/_js/ext-2.0/plugins/image.gif) no-repeat;
			background-position: 0 0;
		}
  </style>


  <script type="text/javascript" src="/admin/_js/ext-2.0/plugins/miframe/miframe-min.js"></script>

  <script type="text/javascript" src="/admin/_js/codepress/codepress.js"></script>



  <script type="text/javascript">

    Ext.onReady(function(){

    		Ext.BLANK_IMAGE_URL = '/admin/_js/ext-2.0/resources/images/default/s.gif';

				// A reusable error reader class for XML forms
				Ext.form.XmlErrorReader = function(){
				    Ext.form.XmlErrorReader.superclass.constructor.call(this, {
				            record : 'field',
				            success: '@success'
				        }, ['id', 'msg']
				    );
				};
				Ext.extend(Ext.form.XmlErrorReader, Ext.data.XmlReader);

				Ext.form.Field.prototype.msgTarget = 'side';

				Ext.QuickTips.init();



				///////////////////////////////////////////////////////////////////////////////////////////
				// Создание и редактирование страницы
				//
				// редактирование
				function editNode(){
						var tree = Ext.getCmp('structureTree');
						var selNode = tree.selModel.selNode;
						if (selNode !== null) {
								windowEditNode(selNode.id, false);
						} else {
								alert("Редактируемый элемент не выбран");
						}
				}
				// создание
				function addNode(){
						var tree = Ext.getCmp('structureTree');
						var selNode = tree.selModel.selNode;
						if (selNode !== null) {
								windowEditNode(selNode.id, true);
						} else {
								alert("Родительский элемент не выбран");
						}
				}
				// список модулей
				var modulesList = new Ext.data.SimpleStore({
						fields: ['value', 'text'],
						data: [
							^rem{ получаем список модулей с названиями }
							$list[^file:list[/admin/modules/;\.p^$]]
							^list.menu{
								$file[^file::load[text;/admin/modules/$list.name][
									$.limit(1024)
								]]
								$match[^file.text.match[#NAME: ([^^\n]+)]]
								$name[^file:justname[$list.name]]
								^if($match){$title[$match.1]}{$title[$name]}
								['$name','$title']
							}[, ]
						]
				});
				// список шаблонов
				var templatesList = new Ext.data.SimpleStore({
						fields: ['value', 'text'],
						data: [
							^rem{ получаем список шаблонов с названиями }
							$list[^file:list[/admin/templates/;\.xsl^$]]
							^list.menu{
								$file[^file::load[text;/admin/templates/$list.name][
									$.limit(1024)
								]]
								$match[^file.text.match[<xsl:stylesheet[^^>]+name\s*=\s*"([^^\n]+)"][i]]
								$name[^file:justname[$list.name]]
								^if($match){$title[$match.1]}{$title[$name]}
								['$name','$title']
							}[, ]
						]
				});

				// окно редактирования (создания) страницы
				function windowEditNode(nodeID, isNew){

						function loader() {
								// форма
								var wf = Ext.getCmp('win_edit_form_panel').getForm();
								wf.load({
										url: 'structure_action.xml',
										params: {
												_id: nodeID,
												cmd: 'get'
										},
										waitMsg: 'Загрузка...',
										failure: requestFailure
								});
						}

						function saver() {
								// форма
								var wf = Ext.getCmp('win_edit_form_panel').getForm();

								if (isNew) cmd = 'add';
								else cmd = 'edit';
								wf.submit({
										url: 'structure_action.xml',
										params: {
												_id: nodeID,
												cmd: cmd,
												module: wf.findField("_module").getValue(),
												template: wf.findField("_template").getValue()
										},
										waitMsg: 'Сохранение...',
										failure: requestFailure,
										success: saveRequestSuccess
								});
						}

						function saveRequestSuccess(f, a) {
								// обновить элемент, в который добавили чего-либо
								var tree = Ext.getCmp('structureTree');
								if(typeof tree.selModel.selNode.reload == 'function'){
									// перезагрузить обновляемый элемент
									tree.selModel.selNode.reload();
								} else {
									// перезагрузить родителя обновляемого элемент
									tree.selModel.selNode.parentNode.reload();
								}
								//alert(a.result.success = true);
								win_edit.hide();
						}

						function requestFailure(f, a) {
								if (a.failureType != 'server') {
										alert("Ошибка соединения с сервером ("+ a.failureType +"). Попробуйте позднее...");
								}
								// можно выводить дополнительное предупреждение об ошибках в форме
						}

				    var fs = new Ext.FormPanel({
				        frame: false,
				        labelAlign: 'right',
				        labelWidth: 170,
				        waitMsgTarget: true,
								cls: 'form_container',
								id: 'win_edit_form_panel',
								defaults: { width: 210 },

				        // configure how to read the XML Data
				        reader : new Ext.data.XmlReader({
				            record : 'data',
				            success: '@success'
				        }, [
				        		{ name: '_module', mapping:'module' },
				        		{ name: '_template', mapping:'template' },
				        		'url', 'name', 'title'
				        ]),

				        // reusable eror reader class defined at the end of this file
				        errorReader: new Ext.form.XmlErrorReader(),

								items: [{
										xtype:"combo",
										fieldLabel:"Модуль страницы",
										name:"_module",
										displayField: 'text',
										valueField: 'value',
										store: modulesList,
										mode: 'local',
										triggerAction: 'all',
										emptyText:'Укажите модуль...',
										allowBlank:false,
										readOnly: true
									}, {
										xtype:"combo",
										fieldLabel:"Шаблон страницы",
										name:"_template",
										displayField: 'text',
										valueField: 'value',
										store: templatesList,
										mode: 'local',
										triggerAction: 'all',
										emptyText:'Укажите шаблон...',
										allowBlank:false,
										readOnly: true
									},{
										xtype:"textfield",
										fieldLabel:"Путь в адресной строке",
										name:"url"
									},{
										xtype:"textfield",
										fieldLabel:"Текст ссылки",
										allowBlank:false,
										name:"name"
									},{
										xtype:"textfield",
										fieldLabel:"Заголовок ссылки (title)",
										name:"title"
									}
								]
				    });


						var win_edit = new Ext.Window({
								title: 'Редактирование свойств страницы',
								autoShow: true,
								layout:'fit',
								draggable: false,
								shadow: false,
								width:460,
								height:230,
								closeAction:'close',
								bodyStyle:'padding: 5 8 0 8',
								//plain: true,
								modal: true,
								resizable: false,
								border: false,
								items: fs
						});


						if (!isNew) win_edit.addButton('Сбросить', loader);

				    var submit = win_edit.addButton({
				        text: 'Сохранить',
				        //disabled: true, // нихера не работает как надо...
				        handler: saver
				    });

				    win_edit.addButton('Отмена', function(){ win_edit.hide(); });


						win_edit.show(null);
						if (!isNew) loader();

				};
				// END создание и редактирование страницы
				///////////////////////////////////////////////////////////////////////////////////////////



				///////////////////////////////////////////////////////////////////////////////////////////
				// удаление страницы
				var delete_node = function(){
						var tree = Ext.getCmp('structureTree');
						if (tree.selModel.selNode !== null) {
								Ext.MessageBox.confirm('Подтвердите удаление', 'Точно удалить? Последний раз спрашиваю!',
										function(btn){
												if (btn == 'yes'){
														var selNodeID = tree.selModel.selNode.id;

														// setup request options
														var options = {
															url: 'structure_action.xml',
															params: {
																cmd: 'del',
																node: selNodeID
															}
														};

														// send request
														var request = new Ext.data.Connection().request(options);

														// нужны проверки успешности запроса.
														// если всё хорошо, то можно обновить элемент
														// если всё плохо - нужно выдать сообщение

														// перезагрузить родителя обновляемого элемента
														if(typeof tree.selModel.selNode.parentNode.reload == 'function'){
															tree.selModel.selNode.parentNode.reload();
														}
												}
										}
								);
						} else {
							alert("Ни один элемент не выбран!");
						}
				};
				// удаление страницы
				///////////////////////////////////////////////////////////////////////////////////////////



				///////////////////////////////////////////////////////////////////////////////////////////
				// дерево структуры сайта

				// кнопки управления структурой
				var structureTreeToolbar = new Ext.Toolbar({
						height: 26,
						items: [{
								//text:'Добавить',
								iconCls: 'ico_add',
								handler: addNode
						},{
								//text:'Удалить',
								iconCls: 'ico_remove',
								handler: delete_node
						},'-',{
								text:'Свойства',
								iconCls: 'ico_conf',
								handler: editNode
						},'->',{
								//text:'Удалить',
								iconCls: 'ico_update',
								handler : function(){
										var tree = Ext.getCmp('structureTree');
										tree.getRootNode().reload();
								}
						}]
				});

				// дерево структуры сайта
        var structureTree = new Ext.tree.TreePanel({
        		id: 'structureTree',
            rootVisible: false,
						animate:false,
            enableDD:true,
            border: false,
            tbar: structureTreeToolbar,
            loader: new Ext.tree.TreeLoader({
            		baseParams: {
            				cmd: 'get_tree'
            		},
                dataUrl: 'structure_action.xml'
            })
        });
        // set the root node
        var structureTreeRoot = new Ext.tree.AsyncTreeNode({
            text: '<i>meganame</i>',
            draggable: false,
            id: 'root'
        });
        structureTree.setRootNode(structureTreeRoot);
        structureTreeRoot.expand();


				// показать окна управления модулем в центральной панели
        function showSettings(node, e){
 					mainTabPanel.load({
 						url: "structure_manage.xml",
 						params: {
 							_id: node.id
 						},
 						scripts: true,
 						text: "Загружаются свойства модуля..."
 					});
        };

        function pagesReorder(dropEvent){
						// setup request options
						var options = {
							url: 'structure_action.xml',
							params: {
								cmd: 'reorder',
								node: dropEvent.dropNode.id,
								point: dropEvent.point,
								target: dropEvent.target.id
							},
							failure: function() { alert("Ошибка pagesReorder"); },
							success: function() { alert("Ok pagesReorder"); }
						};

						// send request
						var request = new Ext.data.Connection().request(options);
        };

				function pagesBeforeAppend(tree, par, node ) {
					if (node.id < 0) {
						node.draggable = false;
					}
					return true;
				};

				structureTree.on("dblclick", showSettings);
				structureTree.on("beforenodedrop", pagesReorder);
				//structureTree.on("beforenodedrop", pagesBeforeMove);
				structureTree.on("beforeappend", pagesBeforeAppend);

				///////////////////////////////////////////////////////////////////////////////////////////




				var templatesTreeToolbar = new Ext.Toolbar({
						height: 26,
						items: [{
								//text:'Добавить',
								iconCls: 'ico_add'
						},{
								//text:'Удалить',
								iconCls: 'ico_remove'
						},'-',{
								text:'Свойства',
								iconCls: 'ico_conf'
						}]
				});



				///////////////////////////////////////////////////////////////////
				// дерево шаблонов
        var templatesTree = new Ext.tree.TreePanel({
            rootVisible: false,
						animate:false,
            enableDD:false,
            border: false,
            tbar: templatesTreeToolbar,
            autoHeight: true,
            containerScroll: true,
            loader: new Ext.tree.TreeLoader()
        });
        // set the root node
        var templatesTreeRoot = new Ext.tree.TreeNode({
            text: 'root',
            draggable:false,
            id:'sl_root'
        });
        templatesTree.setRootNode(templatesTreeRoot);

				var templatesListJSON = [{
						"text" : "meganame.info", "id" : "site_1", "leaf" : false, "cls" : "folder", "children" : [
								^rem{ получаем список шаблонов с названиями }
								$list[^file:list[/admin/templates/;\.xsl^$]]
								^list.menu{
									$file[^file::load[text;/admin/templates/$list.name][
										$.limit(1024)
									]]
									$match[^file.text.match[<xsl:stylesheet[^^>]+name\s*=\s*"([^^\n]+)"][i]]
									^if($match){$name[$match.1]}{$name[$list.name]}
									{"text" : "$name", "id" : "^file:justname[$list.name]", "leaf" : true, "cls" : "file"}
								}[, ]
						]
				}];

				for(var i = 0, len = templatesListJSON.length; i < len; i++) {
					templatesTreeRoot.appendChild(templatesTree.getLoader().createNode(templatesListJSON[i]));
				}


				// показать окна управления шаблоном в центральной панели
        function manageTemplate(node, e){
 					mainTabPanel.load({
 						url: "templates_manage.xml",
 						params: {
 							_name: node.id,
 							action: 'form'
 						},
 						scripts: true,
 						text: "Загружаются свойства шаблона..."
 					});
        }

				templatesTree.on("dblclick", manageTemplate);

				///////////////////////////////////////////////////////////////////




				///////////////////////////////////////////////////////////////////
				// дерево модулей
        var modulesTree = new Ext.tree.TreePanel({
            rootVisible: false,
						animate:false,
            enableDD:false,
            border: false,
            tbar: templatesTreeToolbar,
            autoHeight: true,
            containerScroll: true,
            loader: new Ext.tree.TreeLoader()
        });
        // set the root node
        var modulesTreeRoot = new Ext.tree.TreeNode({
            text: 'root',
            draggable:false,
            id:'sl_root'
        });
        modulesTree.setRootNode(modulesTreeRoot);

				var modulesListJSON = [
						{"text" : "meganame.info", "id" : "site_1", "leaf" : false, "cls" : "folder", "children" :
								[
									^rem{ получаем список шаблонов с названиями }
									$list[^file:list[/admin/modules/;\.p^$]]
									^list.menu{
										$file[^file::load[text;/admin/modules/$list.name][
											$.limit(1024)
										]]
										$match[^file.text.match[<xsl:stylesheet[^^>]+name\s*=\s*"([^^\n]+)"][i]]
										^if($match){$name[$match.1]}{$name[$list.name]}
										{"text" : "$name", "id" : "^file:justname[$list.name]", "leaf" : true, "cls" : "file"}
									}[, ]
								]
						}
				];

				for(var i = 0, len = modulesListJSON.length; i < len; i++) {
					modulesTreeRoot.appendChild(modulesTree.getLoader().createNode(modulesListJSON[i]));
				}


				// показать окна управления шаблоном в центральной панели
        function manageModule(node, e){
 					mainTabPanel.load({
 						url: "modules_manage.xml",
 						params: {
 							_name: node.id,
 							action: 'form'
 						},
 						scripts: true,
 						text: "Загружаются свойства шаблона..."
 					});
        }

				modulesTree.on("dblclick", manageModule);

				///////////////////////////////////////////////////////////////////





				var menu;
				function onTreeRightClick(node, e){
					node.select();
					if(!menu){ // create context menu on first right click
							menu = new Ext.menu.Menu({
									shadow: false,
									items: [{
											id: node.id + '-add',
											text: 'Добавить подраздел',
											handler : addNode,
											iconCls: 'ico_add'
									},{
											id: node.id + '-delete',
											text: 'Удалить раздел',
											handler : delete_node,
											iconCls: 'ico_remove'
									}, '-', {
											id: node.id + '-edit',
											text: 'Свойства',
											handler : editNode,
											iconCls: 'ico_conf'
									}]
							});
					}
					menu.showAt(e.getPoint());
				};

				structureTree.on("contextmenu", onTreeRightClick);



				var mainTabPanel = new Ext.TabPanel({
					activeTab: 0,
					region: 'center',
					id: 'mainTabPanelID',
					margins: '0 5 5 0',
					defaults: { autoScroll:true },
					//tbar: new Ext.Toolbar({ height: 26, items: [{}] }),
					items: [{
						iconCls: 'ico_info',
						title: 'Привет',
						html: '<p>Слева - структура сайта. Там можно тыкать левой (тык-тык) и правой кнопкой мыши.</p>'
					}]
				});


				// сохранялка настроек панелей в кукисах
				// мозги ебёт!!
        //Ext.state.Manager.setProvider(new Ext.state.CookieProvider());

				// основной Viewport
        var viewport = new Ext.Viewport({
					layout:"border",
					items:[
						mainTabPanel,
						{
              region:'north',
              contentEl: 'north',
              border:false,
              margins: "0 0 0 0",
              height:20
            },{
							region:"west",
							width:230,
							split:true,
							minWidth:200,
							maxWidth:350,
							margins: "0 0 5 5",
							layout:"accordion",
							layoutConfig:{ animate:false },
							defaults: { border:false, autoScroll:true },

							items: [{
									title:"Структура сайта",
									iconCls: "ico_nav",
									items: [ structureTree ]
							},{
									title:"Пользователи",
									html:'<p>Когда-нибудь тут будет управление пользователями и правами доступа. А сейчас админ имеет все возможные права, ряд невозможных и два невероятных.</p><p>http://extjs.com/forum/showthread.php?t=6153</p>',
									iconCls: "ico_users"
							},{
									title:"Модули",
									iconCls: "ico_plugin",
									items: [ modulesTree ]
							},{
									title:"Шаблоны",
									iconCls: "ico_template",
									items: [ templatesTree ]
							}]

						}]
        });

				var tb = new Ext.Toolbar();
				//tb.height = 25;
				tb.render('north');
				tb.addSeparator();
				tb.addText("<span style='font-size: 12px'>Одминко $ver</span>");
				tb.addFill();
				tb.addText("<span style='font-size: 12px; color: #999;'>© <a style='color: #449; text-decoration: none;' href='http://www.stopdesign.ru' title='Пездатый сайтег'>StopDesign</span>&nbsp; ");
				//tb.addSeparator();



				// развернуть дерево, когда оно отрендерилось
				templatesTree.expandAll();
				modulesTree.expandAll();

    });



	</script>


  <div id="north"></div>

  <!-- ########################################################################################## -->
  <script type="text/javascript">
		function hideLoadingMask() {
	    var loading = Ext.get("loading");
	    var mask = Ext.get("loading-mask");
	    mask.remove();
	    loading.remove();
	    Ext.get(document.body).setStyle("overflow", "visible");
		}
		hideLoadingMask();
	</script>
</body>
</html>
